#include "tda_gestor_incidencias.h"

int getOpNum(char* comando){

	if (!strcmp(comando,"-addinci"))
		return COM_ADD_INCIDENCIA;
	if (!strcmp(comando,"-addproy"))
		return COM_ADD_PROYECTO;
	if (!strcmp(comando,"-addusua"))
		return COM_ADD_USUARIO;
	if (!strcmp(comando,"-getdatoinci"))
		return COM_GET_DATO_INCIDENCIA;
	if (!strcmp(comando,"-gethistinci"))
		return COM_GET_HISTORIAL_INCIDENCIA;
	if (!strcmp(comando,"-getcomeinci"))
		return COM_GET_COMENTARIOS_INCIDENCIA;
	if (!strcmp(comando,"-getinciusua"))
		return COM_GET_INCIDENCIAS_USUARIO;
	if (!strcmp(comando,"-getinciproy"))
		return COM_GET_INCIDENCIAS_PROYECTO;
	if (!strcmp(comando,"-cambiarestainci"))
		return COM_CAMBIAR_ESTADO_INCIDENCIA;
	if (!strcmp(comando,"-resolinci"))
		return COM_REGIST_RESOLUCION_INCIDENCIA;
	return -1;
}

int main(int argc, char *argv[]){
	TGI tgi;
	TIN tin;
	TAddinci registroTIN;
	project_t tproyect;
	user_t tusers;
	inci_status_t estadoInci;
	inci_comment_t comentInci;
	TListaSimple lestados;
	TListaSimple lcomentarios;
	TCola cincidencias;
	TListaSimple lincidencias;
	int inciID;
	int usuarioID;
	int proyectoID;
	int error=0;
	FILE *archComandos;
	char *lineaComando;
	char *ptr;
	char s2[4] = ";\n\t";


	error = TGI_Crear(&tgi, argv[1], argv[2], argv[3]);
	if (error==-1)
		fprintf(stderr,"Error al crear estructura:%d\n",error);


	archComandos = fopen(argv[4],"r"); /*Abro archivo de comandos*/
	fprintf(stdout, "Gestor de Incidencias:\n");
	while(!feof(archComandos)){
		if(getString(&lineaComando, archComandos) == RES_OK){
			if(lineaComando[(strlen(lineaComando)-1)*sizeof(char)]=='\n')
				lineaComando[(strlen(lineaComando)-1)*sizeof(char)]= '\0';
			ptr = strtok( lineaComando, s2 );    /* Primera llamada => Primer token*/


			switch(getOpNum(ptr)){

					case COM_ADD_INCIDENCIA:

						/* Comandos para agregar Incidencia */

						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&registroTIN.inci_type );
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&registroTIN.inci_priority );
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &registroTIN.inci_user );
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&registroTIN.inci_assigned_user );
						ptr = strtok( NULL, s2 );
						registroTIN.inci_date_created = ptr;
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &registroTIN.inci_project_id );
						ptr = strtok( NULL, s2 );
						registroTIN.inci_summary =ptr;

						ptr = strtok( NULL, s2 );
						registroTIN.inci_description =ptr;

						fprintf(stdout,"\nAgregando incidencia al proyecto: %d\n",registroTIN.inci_project_id);

						error=TGI_AgregarIncidencia(&tgi,registroTIN.inci_type,registroTIN.inci_priority,
								registroTIN.inci_user,registroTIN.inci_assigned_user,registroTIN.inci_date_created,
								registroTIN.inci_project_id,registroTIN.inci_summary,registroTIN.inci_description);
						if (error)
							fprintf(stderr,"Error al agregar nueva incidencia");
					break;

					case COM_ADD_PROYECTO:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&tproyect.project_id );
						ptr = strtok( NULL, s2 );
						tproyect.project_name = ptr;

						fprintf(stdout,"\nAgregando proyecto: %s\n",tproyect.project_name);

						error=TGI_AgregarProyecto(&tgi,tproyect.project_id,tproyect.project_name);
						if (error)
							fprintf(stderr,"Error al agregar nuevo proyecto");
					break;

					case COM_ADD_USUARIO:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&tusers.user_id);
						ptr = strtok( NULL, s2 );
						tusers.user_name=ptr;

						fprintf(stdout,"\nAgregando usuario: %s\n",tusers.user_name);

						error=TGI_AgregarUsuario(&tgi,tusers.user_id,tusers.user_name);
						if (error)
							fprintf(stderr,"Error al agregar nuevo usuario");
					break;

					case COM_CAMBIAR_ESTADO_INCIDENCIA:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &inciID);
						ptr = strtok( NULL, s2 );
						estadoInci.stat_date=ptr;
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&estadoInci.stat_user_id);
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&estadoInci.stat_desc);

						fprintf(stdout,"\nCambiando estado de la incidencia:%d\n",inciID);

						error=TGI_GetIncidencia(&tgi,inciID,&tin);
						if (error)
							fprintf(stderr,"Error al obtener incidencia");

						error=TIN_CambiarEstado(&tin,estadoInci.stat_date,estadoInci.stat_user_id,estadoInci.stat_desc);
						if (error)
							fprintf(stderr,"Error al cambiar estado de la incidencia");

					break;

					case COM_REGIST_RESOLUCION_INCIDENCIA:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &inciID);
						ptr = strtok( NULL, s2 );
						estadoInci.stat_date=ptr;
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &estadoInci.stat_user_id);
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", (int*)&estadoInci.stat_desc);

						fprintf(stdout,"\nResolviendo incidencia:%d\n",inciID);

						error = TGI_GetIncidencia(&tgi,inciID,&tin);
						if (error)
							fprintf(stderr,"Error al obtener incidencia");

						error = TIN_Resolver(&tin,estadoInci.stat_date,estadoInci.stat_user_id,estadoInci.stat_desc);
						if (error)
							fprintf(stderr,"Error al resolver incidencia");
					break;

					case COM_GET_DATO_INCIDENCIA:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &inciID);

						error = TGI_GetIncidencia(&tgi,inciID,&tin);
						if (error)
							fprintf(stderr,"Error al obtener incidencia");

						error = TIN_GetDatos(&tin,&inciID,(tipo_inci_t *)&registroTIN.inci_type,(prior_inci_t *)&registroTIN.inci_priority,&registroTIN.inci_user,
								&registroTIN.inci_assigned_user,&registroTIN.inci_date_created,&registroTIN.inci_project_id,
								&registroTIN.inci_summary,&registroTIN.inci_description);
						if (error)
							fprintf(stderr,"Error al obtener datos de la incidencia");

						fprintf(stdout,"\nID Incidencia: %d\n\t",inciID);
						fprintf(stdout,"Tipo de incidencia:     %d\n\t",registroTIN.inci_type);
						fprintf(stdout,"Prioridad:              %d\n\t",registroTIN.inci_priority);
						fprintf(stdout,"ID Usuario:             %d\n\t",registroTIN.inci_user);
						fprintf(stdout,"ID Usuario asignado:    %d\n\t",registroTIN.inci_assigned_user);
						fprintf(stdout,"Fecha de Creación:      %s\n\t",registroTIN.inci_date_created);
						fprintf(stdout,"ID Proyecto:            %d\n\t",registroTIN.inci_project_id);
						fprintf(stdout,"Sumario:                %s\n\t",registroTIN.inci_summary);
						fprintf(stdout,"Descripción:            %s\n\t",registroTIN.inci_description);

					break;

					case COM_GET_HISTORIAL_INCIDENCIA:

						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &inciID);

						ls_Crear(&lestados,sizeof(inci_status_t));

						error = TGI_GetIncidencia(&tgi,inciID,&tin);
						if (error)
							fprintf(stderr,"Error al obtener incidencia");

						error = TIN_GetListaEstados(&tin,&lestados);
						if (error)
							fprintf(stderr,"Error al obtener historial de estados de la incidencia");

						fprintf(stdout,"\nHistorial de estados para la incidencia: %d\n\t",inciID);
						if(ls_MoverCorriente(&lestados,LS_PRIMERO)){
							do{
								ls_ElemCorriente(lestados,&estadoInci);
								fprintf(stdout,"Fecha:                  %s\n\t",estadoInci.stat_date);
								fprintf(stdout,"ID Usuario:             %d\n\t",estadoInci.stat_user_id);
								fprintf(stdout,"ID Estado:              %d\n\n\t",(int)estadoInci.stat_desc);
								free(estadoInci.stat_date);
								ls_BorrarCorriente(&lestados);
							}while(!ls_Vacia(lestados));
						}
					break;

					case COM_GET_COMENTARIOS_INCIDENCIA:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &inciID);
						ls_Crear(&lcomentarios,sizeof(inci_comment_t));

						error = TGI_GetIncidencia(&tgi,inciID,&tin);
						if (error)
							fprintf(stderr,"Error al obtener incidencia");

						error = TIN_GetListaComentarios(&tin,&lcomentarios);
						if (error)
							fprintf(stderr,"Error al obtener comentarios de la incidencia");

						fprintf(stdout,"\nComentarios de la incidencia: %d\n\t",inciID);
						if(ls_MoverCorriente(&lcomentarios,LS_PRIMERO)){
							do{
								ls_ElemCorriente(lcomentarios,&comentInci);
								fprintf(stdout,"Fecha:                  %s\n\t",comentInci.comm_date);
								fprintf(stdout,"ID Usuario:             %d\n\t",comentInci.comm_user_id);
								fprintf(stdout,"Comentario:             %s\n\n\t",comentInci.comm_desc);
								free(comentInci.comm_date);
								ls_BorrarCorriente(&lcomentarios);
							}while(!ls_Vacia(lcomentarios));
						}
					break;

					case COM_GET_INCIDENCIAS_USUARIO:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &usuarioID);
						C_Crear(&cincidencias,sizeof(TIN));
						error=TGI_GetIncidenciasUsuario(&tgi,usuarioID,&cincidencias);
						if (error)
							fprintf(stderr,"Error al obtener incidencias del usuario");
						fprintf(stdout,"\nIncidencias del usuario: %d\n\t",usuarioID);

						while(!C_Vacia(cincidencias)){
							error = C_Sacar(&cincidencias,&tin);
							fprintf(stdout,"ID Incidencia:          %d\n\n\t",tin.inci_id);
						}

					break;

					case COM_GET_INCIDENCIAS_PROYECTO:
						ptr = strtok( NULL, s2 );
						sscanf(ptr, "%d", &proyectoID);

						ls_Crear(&lincidencias,sizeof(TIN));
						error=TGI_GetIncidenciasProyecto(&tgi,proyectoID,&lincidencias);
						if (error)
							fprintf(stderr,"Error al obtener incidencias del proyecyto");

						fprintf(stdout,"\nIncidencias del proyecto: %d\n\t",proyectoID);
						if(ls_MoverCorriente(&lincidencias,LS_PRIMERO)){
							do{
								ls_ElemCorriente(lincidencias,&tin);
								fprintf(stdout,"ID Incidencia:          %d\n\n\t",tin.inci_id);
								ls_BorrarCorriente(&lincidencias);
							}while(ls_Vacia(lincidencias));
						}

					break;

			}/* Fin switch*/

			if(lineaComando != NULL) free(lineaComando);
		}/*Fin if */
	}/*Fin del While */

	fclose(archComandos);
	error=TGI_Grabar(&tgi,argv[2],argv[1],argv[3]);
	if (error)
		fprintf(stderr,"Error Grabar:%d\n",error);


	error=TGI_Cerrar(&tgi);
	if (error)
		fprintf(stderr,"Error Cerrar:%d\n",error);


	fprintf(stdout,"\nFin del programa.\n");
	return error;
}
